/**
 * ---------------------------
 * Time: 2017/5/13 18:24.
 * Author: Cangshi
 * View: http://palerock.cn
 * ---------------------------
 */

var Main = {
    /**
     * default 和defaultPrototype的区别 ：
     * 1.default会强制覆盖defaultPrototype中同名的属性
     * 2.从业务逻辑上来说，default中的属性或方法是用于内部调用，不建议在对象中调用
     * @param config
     * @returns {*}
     */
    createConfigClass: function (config) {
        if (!config) {
            throw new Error('未制定类信息');
        }
        if (!config.default || typeof config.default != 'object') {
            config.default = {};
        }
        if (!config.defaultPrototype || typeof config.defaultPrototype != 'object') {
            config.defaultPrototype = {};
        }
        config.default.expand({
            init: function () {

                // 判断配置参数是否正确
                if (!this.config || typeof this.config != 'object') {
                    this.config = {}
                }

                // 使用默认配置来扩充当前配置
                var defaultConfig = typeof this.defaultConfig == 'function' ? this.defaultConfig() : {};
                if (!defaultConfig || typeof defaultConfig != 'object') {
                    defaultConfig = {};
                }
                this.config.expandAll(defaultConfig);
                // 调用配置方法
                typeof this.onConfigured == 'function' && this.onConfigured();

                // 使用默认成员变量来扩充当前变量
                var defaultVar = typeof this.defaultVar == 'function' ? this.defaultVar() : {};
                if (!defaultVar || typeof defaultVar != 'object') {
                    defaultVar = {};
                }
                this.expandAll(defaultVar);

                // 调用初始化结束的方法
                typeof this.onInitFinish == 'function' && this.onInitFinish();

                // 清除配置属性
                delete this.config;
            }
        });
        return Cielar.createClass({
            thisClass: function (config) {
                this.config = config;
                this.init();
            },
            defaultPrototype: config.defaultPrototype.extend(config.default, true),
            parentClass: config.parentClass
        });
    }
};
new Cielar.ListenerManage(window);

Main.config = {

};